#!/usr/bin/env bash
# MCP服务管理器 - 处理配置加载、安装和命令映射

set -euo pipefail

# 获取脚本所在目录
MCP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MCP_SERVICES_DIR="$MCP_DIR/services"
MCP_MAPPINGS_DIR="$MCP_DIR/mappings"

# 颜色输出函数
log_info() { echo -e "\033[32m[MCP-INFO]\033[0m $*"; }
log_warn() { echo -e "\033[33m[MCP-WARN]\033[0m $*"; }
log_error() { echo -e "\033[31m[MCP-ERROR]\033[0m $*" >&2; }
log_debug() { 
  if [[ "${DEBUG_MODE:-false}" == "true" ]]; then
    echo -e "\033[36m[MCP-DEBUG]\033[0m $*" >&2
  fi
}

# 全局变量
MCP_SERVICE_NAME=""
MCP_SERVICE_CONFIG=""
MCP_COMMAND_PREFIX=""

# 加载JSON解析工具函数
json_get() {
  local json="$1"
  local key="$2"
  
  # 优先使用jq（更轻量、更快）
  if command -v jq &> /dev/null; then
    echo "$json" | jq -r ".$key // empty"
  elif command -v python3 &> /dev/null; then
    echo "$json" | python3 -c "import json,sys; data=json.load(sys.stdin); print(data.get('$key', '') if not isinstance(data.get('$key'), (dict,list)) else json.dumps(data.get('$key')))"
  elif command -v python &> /dev/null; then
    echo "$json" | python -c "import json,sys; data=json.load(sys.stdin); print(data.get('$key', '') if not isinstance(data.get('$key'), (dict,list)) else json.dumps(data.get('$key')))"
  else
    log_error "需要安装 jq 或 Python 来解析 JSON 配置"
    return 1
  fi
}

# 加载指定的MCP服务配置
load_mcp_config() {
  local service_name="${1:-${MCP_SERVICE:-mcp-gitee}}"
  local config_file="$MCP_SERVICES_DIR/${service_name}.json"
  
  log_info "加载MCP服务配置: $service_name"
  
  if [[ ! -f "$config_file" ]]; then
    log_error "MCP服务配置文件不存在: $config_file"
    log_info "可用的MCP服务:"
    ls -1 "$MCP_SERVICES_DIR"/*.json 2>/dev/null | xargs -n1 basename | sed 's/\.json$//' | sed 's/^/  - /'
    return 1
  fi
  
  # 读取配置文件
  MCP_SERVICE_CONFIG=$(cat "$config_file")
  MCP_SERVICE_NAME="$service_name"
  MCP_COMMAND_PREFIX=$(json_get "$MCP_SERVICE_CONFIG" "prefix")
  
  log_info "MCP服务加载成功: $(json_get "$MCP_SERVICE_CONFIG" "description")"
  log_debug "命令前缀: $MCP_COMMAND_PREFIX"
  
  # 导出环境变量
  export MCP_SERVICE_NAME
  export MCP_COMMAND_PREFIX
  
  return 0
}


# 配置MCP服务环境变量
configure_mcp_env() {
  local service_name="${1:-$MCP_SERVICE_NAME}"
  
  if [[ -z "$MCP_SERVICE_CONFIG" ]]; then
    load_mcp_config "$service_name" || return 1
  fi
  
  log_info "配置MCP服务环境变量"
  
  # 获取环境变量配置
  local env_json=$(json_get "$MCP_SERVICE_CONFIG" "env")
  
  if [[ -n "$env_json" ]] && [[ "$env_json" != "{}" ]] && [[ "$env_json" != "null" ]]; then
    # 统一的环境变量处理函数
    _process_env_vars() {
      while IFS='=' read -r key value; do
        # 替换变量引用 ${VAR} 格式
        if [[ "$value" =~ ^\$\{([^}]+)\}$ ]]; then
          var_name="${BASH_REMATCH[1]}"
          value="${!var_name}"
          log_debug "替换变量引用: \${$var_name} -> ***"
        fi
        export "$key=$value"
        log_debug "导出环境变量: $key=***"
      done
    }
    
    # 根据可用工具选择解析方法
    if command -v jq &> /dev/null; then
      echo "$env_json" | jq -r 'to_entries | .[] | "\(.key)=\(.value)"' | _process_env_vars
    elif command -v python3 &> /dev/null; then
      echo "$env_json" | python3 -c "import json,sys; data=json.load(sys.stdin); [print(f'{k}={v}') for k,v in data.items()]" | _process_env_vars
    elif command -v python &> /dev/null; then
      echo "$env_json" | python -c "import json,sys; data=json.load(sys.stdin); [sys.stdout.write('%s=%s\n' % (k,v)) for k,v in data.items()]" | _process_env_vars
    fi
  fi
  
  return 0
}

# 获取映射后的命令
get_mapped_command() {
  local standard_cmd="$1"
  local service_name="${2:-$MCP_SERVICE_NAME}"
  
  if [[ -z "$MCP_SERVICE_CONFIG" ]] || [[ "$MCP_SERVICE_NAME" != "$service_name" ]]; then
    load_mcp_config "$service_name" || return 1
  fi
  
  # 从配置中获取映射
  local commands_json=$(json_get "$MCP_SERVICE_CONFIG" "commands")
  local mapped_cmd="$standard_cmd"  # 默认值
  
  if [[ -n "$commands_json" ]] && [[ "$commands_json" != "null" ]]; then
    # 优先使用jq
    if command -v jq &> /dev/null; then
      mapped_cmd=$(echo "$commands_json" | jq -r ".[\"$standard_cmd\"] // \"$standard_cmd\"")
    elif command -v python3 &> /dev/null; then
      mapped_cmd=$(echo "$commands_json" | python3 -c "import json,sys; data=json.load(sys.stdin); print(data.get('$standard_cmd', '$standard_cmd'))")
    elif command -v python &> /dev/null; then
      mapped_cmd=$(echo "$commands_json" | python -c "import json,sys; data=json.load(sys.stdin); print(data.get('$standard_cmd', '$standard_cmd'))")
    fi
  fi
  
  # 添加前缀
  echo "${MCP_COMMAND_PREFIX}${mapped_cmd}"
}

# 列出所有可用的MCP服务
list_mcp_services() {
  log_info "可用的MCP服务:"
  
  for config_file in "$MCP_SERVICES_DIR"/*.json; do
    if [[ -f "$config_file" ]]; then
      local service_name=$(basename "$config_file" .json)
      local config=$(cat "$config_file")
      local description=$(json_get "$config" "description")
      echo "  - $service_name: $description"
    fi
  done
}

# 显示MCP服务详情
show_mcp_service_info() {
  local service_name="${1:-$MCP_SERVICE_NAME}"
  
  if [[ -z "$service_name" ]]; then
    log_error "未指定MCP服务名称"
    return 1
  fi
  
  load_mcp_config "$service_name" || return 1
  
  echo "MCP服务信息: $service_name"
  echo "描述: $(json_get "$MCP_SERVICE_CONFIG" "description")"
  echo "命令前缀: $(json_get "$MCP_SERVICE_CONFIG" "prefix")"
  echo ""
  echo "支持的命令映射:"
  
  local commands_json=$(json_get "$MCP_SERVICE_CONFIG" "commands")
  if [[ -n "$commands_json" ]] && [[ "$commands_json" != "null" ]]; then
    # 优先使用jq
    if command -v jq &> /dev/null; then
      echo "$commands_json" | jq -r 'to_entries | .[] | "  \(.key) -> \(.value)"'
    elif command -v python3 &> /dev/null; then
      echo "$commands_json" | python3 -c "import json,sys; data=json.load(sys.stdin); [print(f'  {k} -> {v}') for k,v in data.items()]"
    elif command -v python &> /dev/null; then
      echo "$commands_json" | python -c "import json,sys; data=json.load(sys.stdin); [sys.stdout.write('  %s -> %s\n' % (k,v)) for k,v in data.items()]"
    fi
  fi
}

# 生成.claude.json配置文件（用于Claude CLI）
generate_claude_cli_config() {
  local service_name="${1:-$MCP_SERVICE_NAME}"
  local output_file="${2:-.claude.json}"
  
  if [[ -z "$service_name" ]]; then
    log_error "未指定MCP服务名称"
    return 1
  fi
  
  load_mcp_config "$service_name" || return 1
  
  log_info "更新Claude CLI配置文件: $output_file"
  
  # 获取install.mcpServers配置
  local mcp_servers_json=""
  if command -v jq &> /dev/null; then
    mcp_servers_json=$(json_get "$MCP_SERVICE_CONFIG" "install" | jq -r '.mcpServers // empty')
  fi
  
  if [[ -z "$mcp_servers_json" ]] || [[ "$mcp_servers_json" == "null" ]]; then
    log_error "配置文件中没有mcpServers定义"
    return 1
  fi
  
  # 替换环境变量引用
  local new_mcp_servers=""
  if command -v jq &> /dev/null; then
    # 使用jq处理JSON并替换环境变量
    new_mcp_servers=$(echo "$mcp_servers_json" | jq --arg token "$MCP_TOKEN" '
      walk(if type == "string" and . == "${MCP_TOKEN}" then $token else . end)
    ')
  else
    # 简单替换
    new_mcp_servers="$mcp_servers_json"
    new_mcp_servers="${new_mcp_servers//\$\{MCP_TOKEN\}/$MCP_TOKEN}"
  fi
  
  # 检查是否已存在配置文件
  local final_config=""
  if [[ -f "$output_file" ]]; then
    log_info "配置文件已存在，合并mcpServers配置"
    
    # 读取现有配置
    local existing_config=$(cat "$output_file")
    
    # 合并配置：保留原有内容，只更新mcpServers
    if command -v jq &> /dev/null; then
      final_config=$(echo "$existing_config" | jq --argjson servers "$new_mcp_servers" '.mcpServers = $servers')
    else
      # 如果没有jq，使用简单的文本替换（不够可靠，但作为后备方案）
      log_warn "没有jq，使用简单合并方式"
      final_config="{\"mcpServers\": $new_mcp_servers}"
    fi
  else
    log_info "配置文件不存在，创建新文件"
    # 创建新配置
    if command -v jq &> /dev/null; then
      final_config=$(echo "{}" | jq --argjson servers "$new_mcp_servers" '.mcpServers = $servers')
    else
      final_config="{\"mcpServers\": $new_mcp_servers}"
    fi
  fi
  
  # 写入配置文件
  if command -v jq &> /dev/null; then
    echo "$final_config" | jq '.' > "$output_file"
  else
    echo "$final_config" > "$output_file"
  fi
  
  log_info "Claude CLI配置文件已更新: $output_file"
  return 0
}



# 主函数 - 用于直接执行脚本时
main() {
  local action="${1:-help}"
  
  case "$action" in
    load)
      load_mcp_config "${2:-}"
      ;;
    configure)
      configure_mcp_env "${2:-}"
      ;;
    map)
      get_mapped_command "${2:-}" "${3:-}"
      ;;
    list)
      list_mcp_services
      ;;
    info)
      show_mcp_service_info "${2:-}"
      ;;
    generate-cli-config)
      generate_claude_cli_config "${2:-}" "${3:-}"
      ;;
    help|*)
      echo "MCP服务管理器"
      echo "用法: $0 <action> [options]"
      echo ""
      echo "Actions:"
      echo "  load <service>         - 加载MCP服务配置"
      echo "  configure <service>    - 配置MCP服务环境变量"
      echo "  map <cmd> <service>    - 获取映射后的命令"
      echo "  list                   - 列出所有可用的MCP服务"
      echo "  info <service>         - 显示MCP服务详情"
      echo "  generate-cli-config <service> [output_file] - 生成Claude CLI配置文件"
      echo "  help                   - 显示此帮助信息"
      echo ""
      echo "示例:"
      echo "  $0 list                      # 列出所有可用的MCP服务"
      echo "  $0 info mcp-gitee            # 查看mcp-gitee服务详情"
      echo "  $0 generate-cli-config mcp-gitee  # 生成.claude.json配置文件"
      echo "  $0 generate-cli-config mcp-gitee ~/project/.claude.json  # 生成配置到指定文件"
      ;;
  esac
}

# 如果直接执行脚本，运行主函数
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  main "$@"
fi